package com.example.doubledatasource.query;

import lombok.Data;

import java.time.LocalDateTime;

/**
 * 用户查询条件对象
 * 用于封装用户查询的各种条件
 * 
 * @author example
 * @since 1.0.0
 */
@Data
public class UserQuery {

    /**
     * 用户名（模糊查询）
     */
    private String username;

    /**
     * 邮箱（模糊查询）
     */
    private String email;

    /**
     * 手机号（精确查询）
     */
    private String phone;

    /**
     * 关键字（用于搜索用户名、邮箱）
     */
    private String keyword;

    /**
     * 创建时间开始
     */
    private LocalDateTime startTime;

    /**
     * 创建时间结束
     */
    private LocalDateTime endTime;

    /**
     * 页码（从1开始）
     */
    private Integer page = 1;

    /**
     * 每页大小
     */
    private Integer size = 10;

    /**
     * 排序字段
     */
    private String sortBy = "create_time";

    /**
     * 排序方向（asc/desc）
     */
    private String sortDir = "desc";

    /**
     * 获取分页偏移量
     */
    public Integer getOffset() {
        return (page - 1) * size;
    }

    /**
     * 是否有时间范围查询
     */
    public boolean hasTimeRange() {
        return startTime != null || endTime != null;
    }

    /**
     * 验证并设置默认值
     */
    public void validate() {
        if (page == null || page < 1) {
            page = 1;
        }
        if (size == null || size < 1) {
            size = 10;
        }
        if (size > 100) {
            size = 100; // 限制最大页面大小
        }
        if (sortBy == null || sortBy.trim().isEmpty()) {
            sortBy = "create_time";
        } else {
            // 将Java字段名转换为数据库列名
            sortBy = convertToColumnName(sortBy);
        }
        if (sortDir == null || (!sortDir.equalsIgnoreCase("asc") && !sortDir.equalsIgnoreCase("desc"))) {
            sortDir = "desc";
        }
    }

    /**
     * 将Java字段名转换为数据库列名
     */
    private String convertToColumnName(String fieldName) {
        switch (fieldName) {
            case "username":
                return "username";
            case "email":
                return "email";
            case "phone":
                return "phone";
            case "createTime":
                return "create_time";
            case "updateTime":
                return "update_time";
            default:
                return "create_time"; // 默认按创建时间排序
        }
    }
}
